/**
 * @file utils.h
 * @brief 通用工具函数定义
 * @details 提供文件操作、字符串处理等通用功能
 */
//
// Created by zhanxh on 25-5-6.
//

#ifndef UTILS_H
#define UTILS_H

#include <gtk/gtk.h>
#include <curl/curl.h>
#include <glib.h>

/**
 * @struct parsed_lyrics
 * @brief 解析后的歌词结构体
 * @details 存储解析后的歌词内容和同步状态
 * @var parsed_lyrics::lyrics 歌词内容
 * @var parsed_lyrics::sync 是否为同步歌词
 */
struct parsed_lyrics{
    gchar* lyrics;
    gboolean sync;
};

/**
 * @struct LyricConfig
 * @brief 歌词配置结构体
 * @details 存储歌词配置相关信息
 * @var LyricConfig::text 文本内容
 * @var LyricConfig::track 音轨指针
 */
typedef struct {
    gchar* text;
    gpointer track;
} LyricConfig;


/**
 * @brief 获取歌词文件路径
 * @param track_uri 音轨URI
 * @param suffix 歌词文件后缀名，默认为".lrc"
 * @return 歌词文件的完整路径（需要调用者释放内存）
 */
gchar* get_lrc_path(const gchar* track_uri, const gchar* suffix = ".lrc");

/**
 * @brief 从文件读取内容
 * @param file_path 文件路径
 * @return 文件内容（需要调用者释放内存）
 */
gchar* read_from_file(const gchar* file_path);

/**
 * @brief 写入内容到文件
 * @param file_path 文件路径
 * @param lyric 要写入的歌词内容
 */
void write_to_file(const gchar* file_path, const gchar* lyric);

/**
 * @brief 交换两个double类型变量的值
 * @param xp 第一个double变量指针
 * @param yp 第二个double变量指针
 */
void swap(double* xp, double* yp);

/**
 * @brief 交换两个gchar*类型变量的值
 * @param xp 第一个gchar*变量指针
 * @param yp 第二个gchar*变量指针
 */
void swaptext(gchar** xp, gchar** yp);

/**
 * @brief 分割字符串
 * @param s 要分割的字符串
 * @param delimiter 分隔符
 * @return 分割后的字符串数组（需要调用者释放内存）
 */
gchar** split(const gchar* s, const gchar* delimiter, gint* count);

/**
 * @brief 去除字符串左侧空白字符
 * @param str 要处理的字符串
 * @return 处理后的字符串（需要调用者释放内存）
 */
gchar* ltrim(const gchar* str);

/**
 * @brief 去除字符串右侧空白字符
 * @param str 要处理的字符串
 * @return 处理后的字符串（需要调用者释放内存）
 */
gchar* rtrim(const gchar* str);

/**
 * @brief 去除字符串两侧空白字符
 * @param str 要处理的字符串
 * @return 处理后的字符串（需要调用者释放内存）
 */
gchar* trim(const gchar* str);

/**
 * @brief 将数字转换为时间戳格式字符串
 * @param number 数字值
 * @return 格式化的时间戳字符串（需要调用者释放内存）
 */
gchar* timestamps(gint number);

// extern void set_lyrics(gpointer track, gchar* past, gchar* present, gchar* future, gchar* padding);
size_t WriteCallback(void* contents, size_t size, size_t nmemb, void* userp);
gchar* text_downloader(curl_slist* slist, const gchar* url);

void traverse_directory_ext(const gchar* dir_path, GList** file_list, const gchar** extensions, gsize ext_count);

/**
 * @brief 归一化路径分隔符为当前平台分隔符
 * @param path 原始路径字符串
 * @return 新的路径字符串（需要调用者释放内存）
 */
gchar* normalize_path_separators(const gchar* path);

/**
 * @brief 转换字符串编码为UTF-8（用于从deadbeef API获取的元数据字符串）
 * @param str 输入字符串（可能不是UTF-8编码）
 * @return 转换后的UTF-8字符串（需要调用者释放内存），如果输入为NULL则返回NULL
 */
gchar* convert_to_utf8(const gchar* str);

#endif //UTILS_H
